//package org.wheel.runner;
//
//import cn.hutool.log.Log;
//import cn.hutool.log.LogFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.ApplicationArguments;
//import org.springframework.boot.ApplicationRunner;
//import org.springframework.context.ApplicationContext;
//import org.springframework.stereotype.Component;
//import org.wheel.plugins.starter.jdbc.pool.config.DaoFactory;
//import org.wheel.plugins.starter.jdbc.pool.dao.IBaseDao;
//import org.wheel.plugins.starter.jdbc.pool.service.impl.BaseServiceImpl;
//
//import java.lang.reflect.Constructor;
//import java.lang.reflect.Field;
//import java.lang.reflect.Parameter;
//import java.util.Map;
//
////@Order(2)
////@AutoConfigureAfter({DaoProxyRunner.class})
////@Component
//public class DaoInjectionRunner implements ApplicationRunner {
//
//    // 直接使用 LogFactory 创建日志对象，Hutool 会自动检测项目中的日志框架（优先级：Slf4j > Log4j > Logback > JDK Logging）
//    private static final Log log = LogFactory.get();
//
//    @Autowired
//    private Map<String, BaseServiceImpl<?, ?>> baseServiceMap;
//
//    @Autowired
//    private ApplicationContext applicationContext;
//
//    @Autowired
//    private DaoFactory baseDaoFactory;
//
//    @Override
//    public void run(ApplicationArguments args) throws Exception {
//        log.info("为 Service 注入 BaseDaoFactory 和 Dao");
//        for (BaseServiceImpl<?, ?> service : baseServiceMap.values()) {
//            service.injectDao(baseDaoFactory);
//        }
//        Map<String, Object> allBeans = applicationContext.getBeansWithAnnotation(Component.class);
//        for (Map.Entry<String, Object> entry : allBeans.entrySet()) {
//            Object bean = entry.getValue();
//            Class<?> beanClass = bean.getClass();
//
//            // 检查字段注入
//            Field[] fields = beanClass.getDeclaredFields();
//            for (Field field : fields) {
//                if (IBaseDao.class.isAssignableFrom(field.getType()) || isBaseDaoSubInterface(field.getType())) {
//                    if (field.get(bean) == null) {
//                        // 如果字段为空，进行注入
//                        IBaseDao<?> IBaseDao = baseDaoFactory.getBaseDao(field.getType());
//                        field.setAccessible(true);
//                        field.set(bean, IBaseDao);
//                        log.info("注入字段：{} 到 {}", field.getName(), beanClass.getName());
//                    }
//                }
//            }
//
//            // 检查构造函数注入
//            Constructor<?>[] constructors = beanClass.getConstructors();
//            for (Constructor<?> constructor : constructors) {
//                Parameter[] parameters = constructor.getParameters();
//                for (Parameter parameter : parameters) {
//                    if (IBaseDao.class.isAssignableFrom(parameter.getType()) || isBaseDaoSubInterface(parameter.getType())) {
//                        // 如果构造函数参数是 BaseDao 或其子接口
//                        IBaseDao<?> IBaseDao = baseDaoFactory.getBaseDao(parameter.getType());
//                        // 这里需要更复杂的逻辑来调用构造函数并注入参数
//                        log.info("构造函数参数需要注入：{} 到 {}", parameter.getName(), beanClass.getName());
//                    }
//                }
//            }
//        }
//
//    }
//
//    /**
//     * 是否是BaseDao的接口子类
//     * @param type
//     * @return
//     */
//    private boolean isBaseDaoSubInterface(Class<?> type) {
//        if (type == null) {
//            return false;
//        }
//        return IBaseDao.class.isAssignableFrom(type);
//    }
//}